Fingerprinting이란?

SQL Injection에서 fingerprinting은 오류 메시지, 시스템 테이블, 함수 차이, 버전 문자열 등을 이용해 DBMS 종류와 버전, 스키마 정보를 식별하는 과정이다.

모의 해킹에서는 PTES(Penetration Testing Execution Standard)의 정찰 및 취약점 분석 단계와 연결해서 볼 수 있다.

1. MySQL

시스템 테이블

  • information_schema , mysql , performance_schema , sys 데이터베이스가 존재한다.
mysql> SELECT TABLE_SCHEMA FROM information_schema.TABLES GROUP BY TABLE_SCHEMA;
/*
+--------------------+
| TABLE_SCHEMA       |
+--------------------+
| information_schema |
| DREAMHACK          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)
*/

테이블 정보

  • TABLES 테이블을 통해서 스키마의 정보를 조회할 수 있다.
  • TABLE_SCHEMATABLE_NAME 에 해당하는 정보를 모두 출력한다.
mysql> SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES;
/*
+--------------------+----------------+
| TABLE_SCHEMA       | TABLE_NAME     |
+--------------------+----------------+
| information_schema | CHARACTER_SETS |
...
| DREAMHACK          | users          |
| mysql              | db             |
...
+--------------------+----------------+
292 rows in set (0.01 sec)
*/

컬럼 정보

  • COLUMNS 테이블을 통해 컬럼의 정보를 조회할 수 있음.
  • TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME의 데이터를 모두 조회한다.
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM information_schema.COLUMNS;
/*
+--------------------+----------------+--------------------+
| TABLE_SCHEMA       | TABLE_NAME     | COLUMN_NAME        |
+--------------------+----------------+--------------------+
| information_schema | CHARACTER_SETS | CHARACTER_SET_NAME |
...
| DREAMHACK          | users          | uid                |
| DREAMHACK          | users          | upw                |
...
| mysql              | db             | Db                 |
| mysql              | db             | User               |
...
+--------------------+----------------+--------------------+
3132 rows in set (0.07 sec)
*/

실시간 실행 쿼리 정보

  • PROCESSLIST 테이블을 통해서 실시간으로 실행되는 쿼리를 조회할 수 있다.
mysql> SELECT * FROM information_schema.PROCESSLIST;
/*
+-------------------------------------------------+
| info                                            |
+-------------------------------------------------+
| select info from information_schema.PROCESSLIST |
+-------------------------------------------------+
1 row in set (0.00 sec)
*/
  • sys 데이터베이스의 SESSION 테이블을 통해서 실행 중인 계정과 함께 조회하는 방법도 있음.
mysql> SELECT user, current_statement FROM sys.session;
/*
+----------------+------------------------------------------------+
| user           | current_statement                              |
+----------------+------------------------------------------------+
| root@localhost | select user,current_statement from sys.session |
+----------------+------------------------------------------------+
1 row in set (0.05 sec)
*/

DBMS 계정 정보

  • USER_PRIVILEGES 테이블은 MySQL 서버의 계정 정보를 조회할 수 있다.
  • USER_PRIVILEGES 테이블의 GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE을 조회할 수 있다.
mysql> SELECT GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE FROM information_schema.USER_PRIVILEGES;
mysql> SELECT User, authentication_string FROM mysql.user;

2. MSSQL

시스템 테이블

MSSQL의 경우 초기 설치 시 master , tempd, model, msdb 데이터베이스가 존재한다.

SELECT name FROM sys.databases
/*
name
-------
master
tempdb
model
msdb
dreamhack # 이용자 정의 데이터베이스 (예시)
*/

데이터베이스 정보

SYSDATABASES 테이블을 통해 데이터베이스의 정보를 조회 가능

SELECT name FROM master..sysdatabases;
/*
name
-------
master
tempdb
model
msdb
dreamhack # 이용자 정의 데이터베이스 (예시)
*/
SELECT DB_NAME(1);
/*
master
*/
 
USE dreamhack;
/*
Changed database context to 'dreamhack'.
*/
 
SELECT DB_NAME(0);
/*
dreamhack
*/

테이블 정보

SYSOBJECTS 를 통해서 특정 테이베이스의 테이블 정보를 조회할 수 있다.

xtype='U' 는 이용자 정의 테이블을 의미

SELECT name FROM dreamhack..sysobjects WHERE xtype = 'U';
# xtype='U' 는 이용자 정의 테이블을 의미합니다.
/*
name
-------
users
*/

INFORMATION_SCHEMA 스키마의 TABLES 테이블의 table_name 이름 방법도 있다.

SELECT table_name FROM dreamhack.information_schema.tables;
/*
table_name
-----------
users
*/
 

컬럼 정보

SYSCLOUMNS 테이블을 이용하여 컬럼 정보를 조회할 수 있음.

SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'users');
/*
name
-----
uid
upw
*/

INFORMATION_SCHEMACOLUMNS 테이블을 참조해 조회할 수 있다.

SELECT table_name, column_name FROM dreamhack.information_schema.columns;
/*
table_name	column_name
-------------------------
users		uid
users		upw
*/

3. PostgreSQL

4. Oracle

5. SQLite